<!--
 * @Author: your name
 * @Date: 2021-03-15 20:53:56
 * @LastEditTime: 2021-03-15 20:56:17
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edi
 * @FilePath: \study\js\面试题\数组计算.html
-->
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>

    <body>
        <p>retry</p>

        <!-- <div>
            实现一个retry函数,执行失败时重新执行,直至执行成功或到达最
            大重试次数,每次重试间隔时间为 interva秒
            ·函数可以为同步也可以为异步
            ·抛出异常被视为执行失败,其它则为成功
        </div> -->
        <script>
            // function retry(fun, times, delay) {
            //     console.log('retry () ...', times);
            //     if (times == 0) return;
            //     // new Promise((resovle, inject) => {
            //     try {
            //         console.log(Object.prototype.toString.call(fun), fun instanceof Promise, fun instanceof Function);
            //         if (fun instanceof Promise) {
            //             fun.catch((err) => {
            //                 console.error(3333, err);
            //                 setTimeout(() => {
            //                     retry(fun, --times, delay);
            //                 }, delay);
            //             });
            //         } else if (fun instanceof Function) {
            //             fun();
            //         }
            //         // resovle();
            //     } catch (error) {
            //         console.error(444);
            //         console.error(error);
            //         setTimeout(() => {
            //             retry(fun, --times, delay);
            //         }, delay);
            //     }
            //     // });
            // }

            // retry(
            //     new Promise((res, rej) => {
            //         let r = Math.random();
            //         if (r > 0.1) {
            //             // throw new Error(r);
            //             rej(r);
            //         } else {
            //             console.log(r);
            //         }
            //     }),
            //     3,
            //     1000
            // );
            // retry(
            //     function () {
            //         console.log('fn ....');
            //         let r = Math.random();
            //         if (r > 0.1) {
            //             throw new Error(r);
            //         }
            //     },
            //     3,
            //     1000
            // );

            function retry(fun, times, delay) {
                console.log('retry () ...', times);
                if (times == 0) return;
                try {
                    fun();
                } catch (error) {
                    console.error(error);
                    setTimeout(() => {
                        console.log('setTimeout () ...');
                        retry(fun, --times, delay);
                    }, delay);
                }
            }

            retry(
                function () {
                    console.log('fn ....');
                    let r = Math.random();
                    if (r > 0.1) {
                        throw new Error(r);
                    }
                },
                3,
                1000
            );
        </script>
    </body>
</html>
